<?php

/**
 * contador de visitas
 *
 * <code> 
 *
 * // simple contador de visitas 
 * $contador = new contador;
 *
 * // define el archivo que sera usado para grabar el conteo 
 * $contador->usaArchivo('contador.txt');
 *
 * // muestra las visitas actuales 
 * echo $contador->visitas();
 *
 * // agrega una visita mas! 
 * $contador->cuenta();
 *
 * </code> 
 * 
 * @package       
 * @version     $id$
 * @copyright   1997-2005 The PHP Group
 * @author      Kazuyoshi Tlacaelel <ktlacaelel@gmail.com> 
 * @license     PHP Version 3.0 {@link http://www.php.net/license/3_0.txt}
 */
class contador
{
    /**
     * _candado 
     * 
     * @var     string
     * @access  private
     */
    private $_candado = 'candado.txt';

    /**
     * contador 
     * 
     * @access  public
     * @return  void
     */
    public function contador()
    {
    }

    /**
     * cambiador de candado 
     *
     * da la oportunidad de utilizar un candado differente, definido por el 
     * usuario 
     * 
     * @param   string      $candado 
     * @access  public
     * @return  void
     */
    public function cambiarCandado($candado)
    {
        $this->_candado = $candado;
    }

    /**
     * establecedor del archivo
     *
     * establece el archivo que se utilizara para guardar el conteo
     * 
     * @param   string      $archivo 
     * @access  public
     * @return  void
     */
    public function usaArchivo($archivo)
    {
        $this->archivo = $archivo;
    }

    /**
     * contador de visitas 
     * 
     * cuenta las visitas que se han hecho y devuelve un numero como 
     * resultado 
     *
     * @access  public
     * @return  integer 
     */
    public function visitas()
    {
        return intval(file_get_contents($this->archivo));
    }

    /**
     * calculador del visitante 
     * 
     * cuenta todas las visitas agregando al nuevo visitante sin hacer 
     * cambios a los datos gurdados en el disco duro
     *
     * @access  public
     * @return  integer 
     */
    public function visitaActual()
    {
        return $this->visitas() + 1;
    }

    /**
     * bloqueador 
     *
     * crea un archivo que sera utilizado como candado
     * 
     * @access  protected
     * @return  boolean 
     */
    protected function bloquear()
    {
        file_put_contents($this->_candado, '.');
        return $this->bloqueado(); 
    }

    /**
     * desbloqueador
     * 
     * borra el archivo que esta siendo usado como candado, si el archivo 
     * no existe false regresa como resultado 
     *
     * @access  protected
     * @return  boolean 
     */
    protected function desbloquear()
    {
        if (file_exists($this->_candado)) {
            unlink($this->_candado);
            return true;
        }
        return false;
    }

    /**
     * escaneador de bloqueo 
     *
     * asegura si un candado existe
     * 
     * @access  protected
     * @return  boolean 
     */
    protected function bloqueado()
    {
        return file_exists($this->_candado);
    }

    /**
     * guardador de conteos 
     * 
     * @access  protected
     * @return  integer
     */
    protected function guardaConteo()
    {
        return file_put_contents($this->archivo, $this->visitaActual());
    }

    /**
     * cuenta
     *
     * genera el resultado de el nuevo visitande y lo guarda para que sea 
     * accessible. 
     * 
     * @access  public
     * @return  boolean 
     * @throws   Exception 
     */
    public function cuenta()
    {
        while($this->bloqueado());
        if (!$this->bloquear()) {
            throw new Exception(' no se pudo bloquear el archivo ');
        }
        if (!$this->guardaConteo()) {
            throw new Exception(' no se pudo guardar el archivo ');
        }
        if (!$this->desbloquear()) {
            throw new Exception(' no se pudo desbloquear el archivo ');
        }
        return true;
    }
}

?>
